package com.guomao.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.web.bind.annotation.RequestParam;
import redis.clients.jedis.JedisPoolConfig;

/**
 * Redis配置类 - 用于配置Redis连接池、连接工厂和RedisTemplate
 */
@Configuration
public class RedisConfig {

    /**
     * 创建Jedis连接池配置Bean
     * 使用@ConfigurationProperties注解从配置文件中注入连接池参数
     * prefix = "spring.data.redis.jedis.pool" 指定配置前缀
     */

    @Bean
    @ConfigurationProperties(prefix = "spring.data.redis.jedis.pool")
    public JedisPoolConfig jedisPoolConfig() {
        // 创建Jedis连接池配置实例
        JedisPoolConfig config = new JedisPoolConfig();
//        config.setMaxIdle(Integer.parseInt(maxidle));
        // 打印连接池配置的默认值，用于调试和验证配置加载
        System.out.println("默认值最大空闲数：" + config.getMaxIdle());
        System.out.println("默认值最小空闲数：" + config.getMinIdle());
        System.out.println("默认值最大链接数：" + config.getMaxTotal());

        // 返回配置实例，Spring会自动将配置文件中的属性注入到该对象
        return config;
    }

    /**
     * 创建Jedis连接工厂Bean
     * 依赖注入JedisPoolConfig，用于配置连接池参数
     */
    @Bean
    public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig config) {
        // 打印配置完成后的连接池参数，验证配置是否正确加载
        System.out.println("配置完毕最大空闲数：" + config.getMaxIdle());
        System.out.println("配置完毕最小空闲数：" + config.getMinIdle());
        System.out.println("配置完毕最大连接数：" + config.getMaxTotal());

        // 创建Jedis连接工厂实例
        JedisConnectionFactory factory = new JedisConnectionFactory();
        // 设置连接池配置
        factory.setPoolConfig(config);
        // 设置Redis服务器主机地址（这里为空字符串，实际使用时需要配置）
//        factory.setHostName("");
        // 返回连接工厂实例
        return factory;
    }

    /**
     * 创建RedisTemplate Bean
     * 用于执行Redis操作，依赖注入JedisConnectionFactory
     * 泛型参数<String, Object>表示键的类型为String，值的类型为Object
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory factory) {
        // 打印连接信息，用于调试和验证连接配置
        System.out.println("连接的地址是:" + factory.getHostName());
        System.out.println("连接的端口是:" + factory.getPort());

        // 创建RedisTemplate实例
        RedisTemplate<String, Object> template = new RedisTemplate<>();

        // 设置连接工厂
        template.setConnectionFactory(factory);

        // 设置键的序列化器为StringRedisSerializer，确保键以字符串形式存储
        template.setKeySerializer(new StringRedisSerializer());

        // 设置值的序列化器为StringRedisSerializer，确保值以字符串形式存储
        template.setValueSerializer(new StringRedisSerializer());
        // 返回配置完成的RedisTemplate实例
        return template;
    }
}
